<?php

namespace Mi7soft;
defined('MI7') or exit('No direct script access allowed');
/**
 *
 */

$EXCEPTION_TYPE = array(
    '1' => 'E_ERROR',
    '2' => 'E_WARNING',
    '4' => 'E_PARSE',
    '8' => 'E_NOTICE',
    '16' => 'E_CORE_ERROR',
    '32' => 'E_CORE_WARNING',
    '64' => 'E_COMPILE_ERROR',
    '128' => 'E_COMPILE_WARNING',
    '256' => 'E_USER_ERROR',
    '512' => 'E_USER_WARNING',
    '1024' => 'E_USER_NOTICE',
    '2048' => 'E_STRICT',
    '4096' => 'E_RECOVERABLE_ERROR',
    '8191' => 'E_ALL',
);

function mi7_get_exception_type($type)
{
    global $EXCEPTION_TYPE;
    if (isset($EXCEPTION_TYPE[$type])) {
        return $EXCEPTION_TYPE[$type];
    } else {
        return $type;
    }
}

/**
 * 记录日志
 * @param $log
 */
function mi7_error_log($log)
{
    global $configs;
    $error_file_name = isset($configs['error_file_name']) && $configs['error_file_name']
        ? $configs['error_file_name']
        : 'php_error.log';
    $log_file = BASEPATH . "/logs/" . $error_file_name;
    error_log("\n[" . date('Y-m-d H:i:s') . "] " . addslashes($log), 3, $log_file);
}


/**
 * 捕捉一些致命错误
 */
function fun_error()
{
    /**
     * error_get_last()
     * [type] - 错误类型
     * [message] - 错误消息
     * [file] - 发生错误所在的文件
     * [line] - 发生错误所在的行
     */
    if ($error = error_get_last()) {
        $log = '致命错误: Type:' . mi7_get_exception_type($error['type']) . ' Msg:[' . $error['message'] . ' in:[' . $error['file'] . '] on:[' . $error['line'] . '] line .';
        mi7_error_log($log);
        exit;
    }
}


/**
 * 捕获系统产生的一些Warning、Notice级别的错误
 * @param $type
 * @param $message
 * @param $file
 * @param $line
 */
function fun_warning_notice($type, $message, $file, $line)
{
    $log = '一般错误 Type: ' . mi7_get_exception_type($type) . ' Msg:[' . $message . '] in:[' . $file . '] on:[' . $line . '] line .';
    mi7_error_log($log);
}


/**
 * 捕捉异常
 * Throwable
 * @param $exception
 */
function fun_exception($exception)
{
    $time = date('Y-m-d H:i:s');
    //拼接要记录成日志的信息
    $log = "Exception: " . $exception->getMessage() . " in:[" . $exception->getFile() . "] on:[" . $exception->getLine() . '] line .';
    mi7_error_log($log);
}


/**
 * 注册
 */

// 捕捉一些致命错误
register_shutdown_function(function () {
    /**
     * error_get_last()
     * [type] - 错误类型
     * [message] - 错误消息
     * [file] - 发生错误所在的文件
     * [line] - 发生错误所在的行
     */
    if ($error = error_get_last()) {
        $log = '致命错误: Type:' . mi7_get_exception_type($error['type']) . ' Msg:[' . $error['message'] . ' in:[' . $error['file'] . '] on:[' . $error['line'] . '] line .';
        echo '致命错误';
//        mi7_error_log($log);
        exit;
    }
});

// 捕获系统产生的一些Warning、Notice级别的错误
set_error_handler(function ($type, $message, $file, $line) {
    $log = '一般错误 Type: ' . mi7_get_exception_type($type) . ' Msg:[' . $message . '] in:[' . $file . '] on:[' . $line . '] line .';
    echo '一般错误';
//    echo $log;
//    mi7_error_log($log);
});


set_exception_handler(function ($exception) {
    $time = date('Y-m-d H:i:s');
    //拼接要记录成日志的信息
    $log = "Exception: " . $exception->getMessage() . " in:[" . $exception->getFile() . "] on:[" . $exception->getLine() . '] line .';
    echo '有报错';
//    echo $log;
//    mi7_error_log($log);
}); // 捕捉其它

